<template>
  <div class="fullheight">
    <el-dialog
      width="55%"
      top="6vh"
      title="排课规则"
      class="sp-manager__dialog"
      :visible.sync="dialogVisible"
      v-if="dialogVisible"
      :before-close="beforeCloseDialog"
      append-to-body
      :close-on-click-modal="false"
    >
      <el-form :model="formData" v-form data-vv-scope="ruleManagerForm">
        <el-row>
          <el-col :span="12">
            <ht-form-item label="名称">
              <ht-input
                v-model="formData.mc"
                placeholder="请输入名称"
                validate="required"
                :maxlength="128"
                :showWordLimit="true"
              ></ht-input>
            </ht-form-item>
          </el-col>
          <el-col :span="12">
            <ht-form-item label="规则编码">
              <ht-input
                v-model="formData.gzbm"
                validate="required"
                placeholder="请输入规则编码"
                :disabled="formData.pkgzid"
              ></ht-input>
            </ht-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="12">
              <!-- <ht-form-item label="必要条件">
               <ht-select
                 v-model="formData.bytj"
                 :options="options"
                 :validate="{required: true}"
                 placeholder="请选择"
               />
             </ht-form-item>
            <ht-form-item label="默认">
               <ht-select
                 v-model="formData.sfmr"
                 :options="options"
                 :validate="{required: true}"
                 placeholder="请选择"
               />
             </ht-form-item> -->
          </el-col>
            <!--
          <el-col :span="12">
            <ht-form-item label="权重">
              <ht-input
                v-model="formData.qz"
                placeholder="请输入权重"
                type="number"
              ></ht-input>
            </ht-form-item>
          </el-col>-->
        </el-row>
        <el-row>
          <el-col :span="12">
            <ht-form-item label="状态">
              <ht-select
                v-model="formData.zt"
                :options="statusList"
                :validate="{required: true}"
                :disabled="formData.sfmr == '1'"
                placeholder="请选择"
              />
            </ht-form-item>
          </el-col>
          <el-col :span="12">
            <ht-form-item label="分组">
              <ht-select
                v-model="formData.fz"
                :options="groupList"
                :validate="{required: true}"
                placeholder="请选择"
              />
            </ht-form-item>
          </el-col>
        </el-row>
        <el-row>
            <el-tooltip placement="top">
                <div slot="content"><pre>
                  触发类型为 单轮种群 一般用于计算时间冲突，课程离散程度等都是内置核心规则。
                  触发类型为 单个染色体  一般用于计算任务书安排的教室、时间是否合理 返回0 合理， 返回1000，
                  直接不考虑当前任务的安排的教室、时间， 返回 1~10 标识排课可用，无严重冲突，但是不是最优的接，值越小，排课越合理，
                  还可以计算每一周的星期几的哪些教室的哪些时间不排课。
                  触发类型为 所有种群 每周的课表信息 一般用于某些特殊课节不排课，如指定第二周的星期一，1到2 课节不排课，
                  原本排在第二周的星期一，1到2的课程往后推一周
              </pre></div>
              <ht-form-item label="触发类型" content="">
                <ht-select
                  v-model="formData.gzcflx"
                  :options="gzcflxGroupList"
                  :validate="{required: true}"
                  placeholder="请选择"
                  :disabled="formData.sfmr == '1'"
                />
              </ht-form-item>
            </el-tooltip>
        </el-row>
        <el-row>
          <ht-form-item label="脚本示例" v-if="formData.sfmr == '0' && formData.gzcflx">
            <codemirror
              v-if="formData.gzcflx == 'chromosome'"
              ref="mycode2"
              v-model="groovyScriptChromosomeDemo1"
              :options="cmOptions"
              class="code"
            ></codemirror>
              <codemirror
                      v-else-if="formData.gzcflx == 'populations'"
                      ref="mycode2"
                      v-model="groovyScriptChromosomeDemo2"
                      :options="cmOptions"
                      class="code"
              ></codemirror>
              <pre v-else>暂不提供</pre>
          </ht-form-item>
        </el-row>
        <el-row>
          <ht-form-item label="脚本" v-if="formData.sfmr == '0'">
            <codemirror
              v-if="dialogVisible"
              ref="mycode"
              v-model="groovyScript"
              :options="cmOptions"
              class="code"
            ></codemirror>
          </ht-form-item>
        </el-row>
        <el-row>
          <ht-form-item label="描述">
              <el-input
                      v-model="formData.ms"
                      type="textarea"
                      placeholder="请输入描述"
                      :autosize="autosize"
              ></el-input>
          </ht-form-item>
        </el-row>
      </el-form>
      <div slot="footer" style="text-align: center" v-show="viewModel !== '1'">
        <el-button type="primary" @click="saveData">{{
          $t('eip.common.save')
        }}</el-button>
        <el-button @click="beforeCloseDialog">{{
          $t('eip.common.cancel')
        }}</el-button>
      </div>
    </el-dialog>
  </div>
</template>
<script>
import course from '@/api/course.js'

export default {
  props: {
      viewModel: String, // 1 查看
  },
  data() {
    return {
      cmOptions: {
        value: '',
        mode: 'java',
        readOnly: false,
        smartIndent: true,
        tabSize: 2,
        theme: 'base16-light',
        lineNumbers: true,
        line: true
      },
      dialogVisible: false,
      formData: {jbStr: '', jb: ''},
      groovyScript: '',
      saveMethod: 'POST',
      autosize: {
        minRows: 3
      },
      options: [
        {key: '1', value: '是'},
        {key: '0', value: '否'}
      ],
      statusList: [
        {key: '1', value: '启用'},
        {key: '0', value: '禁用'}
      ],
      groupList: [],
      gzcflxGroupList: [
        {key: 'chromosome', value: '单个染色体'},
        {key: 'singlePopulation', value: '单轮种群'},
        {key: 'populations', value: '所有种群'}
      ],
      groovyScriptChromosomeDemo1:
        '/**\n' +
          '最终结果返回 0~10 或者 1000  值越低 表示排课结果越优先 \n' +
          '如： return 0； 表示排课结果最优先级最高\n' +
          'return 1;\n' +
          'return 2;\n' +
          'return 3;\n' +
          'return 10; 排课结果优先级低\n' +
          'return 1000;  一定不排课 \n' +
          '**/\n' +
          '// 变量 teachingPlan 教学计划 任务书对象  TeachingPlan 类型 \n' +
          '// 如获取上课地点类型\n' +
          'String skddlx = teachingPlan.getSkddlx();\n' +
          '// 变量 classroom 教室基本数据对象 IcsBJsjbsj 类型\n' +
          '// 如获取教室座位数\n' +
          'int zws = classroom.getZws();\n' +
          '// 变量 time 上课时间\n' +
          '// 时间段\n' +
          '/**\n' +
          '* morning 早上\n' +
          '* afternoon 下午\n' +
          '* night  晚上\n' +
          '*/\n' +
          'String sjd =  time.getIcsBSdjbsj().getSjd()；\n' +
          '\n' +
          '/**\n' +
          '  * 开始节数 变量 ksjs  Integer数字类型 如 ksjs ==1 \n' +
          '  */\n' +
          '/**\n' +
          '  * 结束节数  变量 jsjs  Integer数字类型  jsjs ==2\n' +
          '  */\n' +
          '\n' +
          '\n' +
          '// 星期几   Integer数字类型 星期一  1  星期二 2 星期三 3 ....\n' +
          'String weekOrder = time.getWeekOrder();\n' +
          '// 变量 djz  第几周 Integer数字类型 第一周 1 第二周 2  第三周 3\n' +
          '// 第一周\n' +
          'if(djz == 1){\n' +
          '}\n' +
          '// 星期几 Integer数字类型 星期一  1  星期二 2 星期三 3 ....\n' +
          '// 星期一\n' +
          'if(xqj == 1){\n' +
          '}\n' +
          '// 变量 sjd 时间段 String字符类型\n' +
          '/**\n' +
          '* morning 早上\n' +
          '* afternoon 下午\n' +
          '* night  晚上\n' +
          '*/ \n' +
          '// 早上时间段\n' +
          'if("morning"equals(sjd)){\n' +
          '}\n' +
          '// 变量 jszws 教室座位数 Integer数字类型\n' +
          '// 变量 jslx 教室类型 String字符类型\n' +
          '// 变量classroomid 教室id String字符类型\n' +
          '\n' +
          '// 任务书\n' +
          '// 变量 jxbrs 教学班人数 Integer数字类型\n' +
          '// 变量 skddlx 上课地点类型 String字符类型 \n' +
          '// 变量 kcxz 课程性质 字符类型\n' +
          '/**\n' +
          '* majorNeed\t专业必修课\n' +
          '* majorOptional\t专业选修课\n' +
          '* publicNeed\t公共必修课\n' +
          '* publicOptional\t公共选修课\n' +
          '*/\n' +
          '// 变量 jgzc 教工职称 Set<String>类型\n' +
          'if(jgzc.contains("xxx")){\n' +
          '}\n' +
          '// 变量 jggwlx 教工岗位类型 Set<String>类型\n' +
          '/**\n' +
          '* <pre>\n' +
          '*   \n' +
          '*     if(jggwlx.contains("external") && "morning".equals(sjd)){\n' +
          '*         return 2;\n' +
          '*     }\n' +
          '*     return 0;\n' +
          '* </pre>\n' +
          '*/\n' +
          '\n' +
          '// 示例1 选修课 优先安排下午\n' +
          'if(("majorOptional".equals(kcxz) || "publicOptional".equals(kcxz) ) && !("afternoon".equals(sjd) || "night".equals(sjd) )){\n' +
          '  // 选修课 如果不是下午和晚上 返回1 如果是下午和晚上的返回0\n' +
          'return 1;\n' +
          '}\n' +
          'return 0;\n' +
          '\n' +
          '// 示例2\n' +
          '// 教工岗位类型为 external 优先不排 早上\n' +
          'if(jggwlx.contains("external") && "morning".equals(sjd)){\n' +
          '    return 2;\n' +
          '}\n' +
          'return 0;\n' +
          '\n' +
          '// 示例3\n' +
          '// 2. 假设每一周的星期几（如周一）哪课节（如 1~2 ）不排课，  需要更换其他教室排课\n' +
          'if(xqj == 1 && (ksjs == 1 || jsjs == 2)){\n' +
          '  return 1000;\n' +
          '}\n' +
          'return 0;\n' +
          '// 示例4\n' +
          '// 假设每一周的星期几（如周一）哪课节（如 1~2 ) 哪个教室， 则需要换教室进行排课\n' +
          'if(xqj == 1 &&  (ksjs == 1 || jsjs == 2) && "111".equals(classroomid)){\n' +
          '  return 1000;\n' +
          '}\n' +
          'return 0;',
        groovyScriptChromosomeDemo2:
            '/**\n' +
            '最终结果返回 0~10 或者 1000  值越低 表示排课结果越优先 \n' +
            '如： return 0； 表示排课结果最优先级最高\n' +
            'return 1;\n' +
            'return 2;\n' +
            'return 3;\n' +
            'return 10; 排课结果优先级低\n' +
            'return 1000;  一定不排课 \n' +
            '**/\n' +
            '// 变量 teachingPlan 教学计划 任务书对象  TeachingPlan 类型 \n' +
            '// 如获取上课地点类型\n' +
            'String skddlx = teachingPlan.getSkddlx();\n' +
            '// 变量 classroom 教室基本数据对象 IcsBJsjbsj 类型\n' +
            '// 如获取教室座位数\n' +
            'int zws = classroom.getZws();\n' +
            '// 变量 time 上课时间\n' +
            '// 时间段\n' +
            '/**\n' +
            '* morning 早上\n' +
            '* afternoon 下午\n' +
            '* night  晚上\n' +
            '*/\n' +
            'String sjd =  time.getIcsBSdjbsj().getSjd()；\n' +
            '\n' +
            '/**\n' +
            '  * 开始节数 变量 ksjs  Integer数字类型 如 ksjs ==1 \n' +
            '  */\n' +
            '/**\n' +
            '  * 结束节数  变量 jsjs  Integer数字类型  jsjs ==2\n' +
            '  */\n' +
            '\n' +
            '\n' +
            '// 星期几   Integer数字类型 星期一  1  星期二 2 星期三 3 ....\n' +
            'String weekOrder = time.getWeekOrder();\n' +
            '// 变量 djz  第几周 Integer数字类型 第一周 1 第二周 2  第三周 3\n' +
            '// 第一周\n' +
            'if(djz == 1){\n' +
            '}\n' +
            '// 星期几 Integer数字类型 星期一  1  星期二 2 星期三 3 ....\n' +
            '// 星期一\n' +
            'if(xqj == 1){\n' +
            '}\n' +
            '// 变量 sjd 时间段 String字符类型\n' +
            '/**\n' +
            '* morning 早上\n' +
            '* afternoon 下午\n' +
            '* night  晚上\n' +
            '*/ \n' +
            '// 早上时间段\n' +
            'if("morning"equals(sjd)){\n' +
            '}\n' +
            '// 变量 jszws 教室座位数 Integer数字类型\n' +
            '// 变量 jslx 教室类型 String字符类型\n' +
            '// 变量classroomid 教室id String字符类型\n' +
            '\n' +
            '// 任务书\n' +
            '// 变量 jxbrs 教学班人数 Integer数字类型\n' +
            '// 变量 skddlx 上课地点类型 String字符类型 \n' +
            '// 变量 kcxz 课程性质 字符类型\n' +
            '/**\n' +
            '* majorNeed\t专业必修课\n' +
            '* majorOptional\t专业选修课\n' +
            '* publicNeed\t公共必修课\n' +
            '* publicOptional\t公共选修课\n' +
            '*/\n' +
            '// 变量 jgzc 教工职称 Set<String>类型\n' +
            'if(jgzc.contains("xxx")){\n' +
            '}\n' +
            '// 变量 jggwlx 教工岗位类型 Set<String>类型\n' +
            '\n' +
            '/**\n' +
            ' * 返回值不为0 表示不排课  或者 返回true 表示不排课 false  排课\n' +
            ' */\n' +
            '// \n' +
            '// 示例1  假设某一周的星期二 1~2 不排课 ， 则原来的周课表都往后延后一周 如果没有排满周学期数的情况下\n' +
            '// 第二周 星期一 1 ，2 节不排课\n' +
            'if(djz==2 && xqj ==1 && (ksjs == 1||ksjs == 2)){\n' +
            'return 1000;\n' +
            '}\n' +
            'return 0;\n' +
            '\n' +
            '// 示例1 第二周 星期一 1 ，2 节不排课\n' +
            'if(djz==2 && xqj ==1 && (ksjs == 1||ksjs == 2)){\n' +
            '// 不排课\n' +
            'return true;\n' +
            '}\n' +
            '// 排课\n' +
            'return false;'
    }
  },
  mounted() {
    this.$validator = this.$root.$validator
  },
  methods: {
    showDialog(id, groupList) {
      this.groupList = groupList
      if (id) {
        course.getRuleData(id).then(resp => {
          this.formData = resp.value

          this.$nextTick(() => {
            this.groovyScript = ''
            if (this.formData.jb) {
              this.groovyScript = Base64.decode(this.formData.jb)
            }
          })

          this.dialogVisible = true
        })
      } else {
        this.formData = {
          sfmr: '0',
          bytj: '1',
          zt: '1',
          fz: 'default',
          jbStr: ''
        }
        this.dialogVisible = true
      }
    },
    beforeCloseDialog() {
      this.formData = {}
      this.dialogVisible = false
    },
    saveData() {
      this.formData.jb = Base64.encode(this.groovyScript)
      let _this = this
      this.$validator.validateAll('ruleManagerForm').then(result => {
        if (result) {
          course.saveRuleData(this.formData).then(resp => {
            if (resp.state) {
              this.$message.success(resp.message || '保存成功')
              this.afterSaveData()
            }
          })
        } else {
          let arr = this.$validator.errors.items.filter(
            item => item.scope == 'ruleManagerForm'
          )
          let errorLength = arr.length
          this.$message({
            showClose: true,
            message: `有${errorLength}个字段未通过校验，请正确填写表单内容。`,
            type: 'warning'
          })
        }
      })
    },
    afterSaveData() {
      setTimeout(() => {
        this.beforeCloseDialog()
        this.$parent && this.$parent.loadData({})
      }, 500)
    }
  }
}
</script>
<style lang="scss" scoped>
.sp-manager__dialog ::v-deep .el-dialog > .el-dialog__body {
  height: calc(100% - 170px);
}
</style>
